@sync-in/server 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/CHANGELOG.md +64 -10
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +18 -17
  4. package/server/app.bootstrap.js +4 -2
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +9 -0
  7. package/server/app.constants.js.map +1 -1
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +100 -12
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +29 -8
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +39 -14
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/doc-textify/adapters/pdf.js +5 -16
  65. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  66. package/server/applications/files/utils/files.js +1 -1
  67. package/server/applications/files/utils/files.js.map +1 -1
  68. package/server/applications/files/utils/send-file.js +3 -2
  69. package/server/applications/files/utils/send-file.js.map +1 -1
  70. package/server/applications/links/services/links-queries.service.js +1 -1
  71. package/server/applications/links/services/links-queries.service.js.map +1 -1
  72. package/server/applications/notifications/constants/notifications.js +5 -1
  73. package/server/applications/notifications/constants/notifications.js.map +1 -1
  74. package/server/applications/notifications/i18n/de.js +8 -2
  75. package/server/applications/notifications/i18n/de.js.map +1 -1
  76. package/server/applications/notifications/i18n/es.js +8 -2
  77. package/server/applications/notifications/i18n/es.js.map +1 -1
  78. package/server/applications/notifications/i18n/fr.js +8 -2
  79. package/server/applications/notifications/i18n/fr.js.map +1 -1
  80. package/server/applications/notifications/i18n/hi.js +8 -2
  81. package/server/applications/notifications/i18n/hi.js.map +1 -1
  82. package/server/applications/notifications/i18n/it.js +8 -2
  83. package/server/applications/notifications/i18n/it.js.map +1 -1
  84. package/server/applications/notifications/i18n/ja.js +8 -2
  85. package/server/applications/notifications/i18n/ja.js.map +1 -1
  86. package/server/applications/notifications/i18n/ko.js +8 -2
  87. package/server/applications/notifications/i18n/ko.js.map +1 -1
  88. package/server/applications/notifications/i18n/pl.js +8 -2
  89. package/server/applications/notifications/i18n/pl.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt.js +8 -2
  91. package/server/applications/notifications/i18n/pt.js.map +1 -1
  92. package/server/applications/notifications/i18n/pt_br.js +8 -2
  93. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  94. package/server/applications/notifications/i18n/ru.js +8 -2
  95. package/server/applications/notifications/i18n/ru.js.map +1 -1
  96. package/server/applications/notifications/i18n/tr.js +8 -2
  97. package/server/applications/notifications/i18n/tr.js.map +1 -1
  98. package/server/applications/notifications/i18n/zh.js +8 -2
  99. package/server/applications/notifications/i18n/zh.js.map +1 -1
  100. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  101. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  102. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  103. package/server/applications/notifications/mails/models.js +38 -3
  104. package/server/applications/notifications/mails/models.js.map +1 -1
  105. package/server/applications/notifications/mails/templates.js +1 -1
  106. package/server/applications/notifications/mails/templates.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  108. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  109. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.js +17 -10
  111. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  112. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  113. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  114. package/server/applications/shares/services/shares-queries.service.js +11 -1
  115. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  116. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  117. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  119. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  121. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  123. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  124. package/server/applications/spaces/utils/permissions.js +2 -2
  125. package/server/applications/spaces/utils/permissions.js.map +1 -1
  126. package/server/applications/sync/services/sync-manager.service.js +1 -0
  127. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  130. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  131. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  132. package/server/applications/users/constants/user.js +1 -1
  133. package/server/applications/users/constants/user.js.map +1 -1
  134. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  135. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  136. package/server/applications/users/services/users-manager.service.js +1 -2
  137. package/server/applications/users/services/users-manager.service.js.map +1 -1
  138. package/server/applications/users/services/users-queries.service.js +67 -68
  139. package/server/applications/users/services/users-queries.service.js.map +1 -1
  140. package/server/applications/users/users.gateway.js +6 -0
  141. package/server/applications/users/users.gateway.js.map +1 -1
  142. package/server/applications/users/users.module.js +2 -1
  143. package/server/applications/users/users.module.js.map +1 -1
  144. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  145. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  146. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  147. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  148. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  149. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  150. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  151. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  152. package/server/authentication/constants/auth-ldap.js +2 -0
  153. package/server/authentication/constants/auth-ldap.js.map +1 -1
  154. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  155. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  156. package/server/common/functions.js +0 -8
  157. package/server/common/functions.js.map +1 -1
  158. package/server/common/image.js +63 -58
  159. package/server/common/image.js.map +1 -1
  160. package/server/common/shared.js +18 -1
  161. package/server/common/shared.js.map +1 -1
  162. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  163. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  164. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  165. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  166. package/static/3rdpartylicenses.txt +1380 -57
  167. package/static/assets/favicon.svg +2 -25
  168. package/static/assets/logo-dark.svg +2 -32
  169. package/static/assets/logo.svg +2 -32
  170. package/static/assets/mimes/application-sql.svg +29 -1
  171. package/static/assets/mimes/application-x-sql.svg +29 -0
  172. package/static/assets/mimes/image-bmp.svg +12 -0
  173. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  174. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  175. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  176. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  177. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  178. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  179. package/static/assets/pdfjs/version +1 -1
  180. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  181. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  182. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  183. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  184. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  185. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  186. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  187. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  189. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  191. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  192. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  195. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  196. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  198. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  200. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  202. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  203. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  204. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  205. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  206. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  208. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  209. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  210. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  211. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  212. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  213. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  214. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  216. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  217. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  218. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  219. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  220. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  222. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  223. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  224. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  225. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  226. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  227. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  228. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  229. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  230. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  231. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  232. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  233. package/static/assets/pdfjs/web/viewer.css +141 -110
  234. package/static/assets/pdfjs/web/viewer.html +7 -7
  235. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  236. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  237. package/static/chunk-22DWHRCL.js +1 -0
  238. package/static/chunk-23UUFZSR.js +1 -0
  239. package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
  240. package/static/chunk-25QTY2GI.js +1 -0
  241. package/static/chunk-2E7IJZLL.js +1 -0
  242. package/static/chunk-2FC5EKS5.js +1 -0
  243. package/static/chunk-2FOWUJQF.js +1 -0
  244. package/static/chunk-2XPHUNYN.js +1 -0
  245. package/static/chunk-32L7RG2G.js +1 -0
  246. package/static/chunk-3IISSX63.js +1 -0
  247. package/static/chunk-3OHSTP3R.js +1 -0
  248. package/static/chunk-42L6C5MT.js +1 -0
  249. package/static/chunk-4AGQL5GV.js +1 -0
  250. package/static/chunk-4BPSQMI2.js +1 -0
  251. package/static/chunk-4FDRWZWT.js +1 -0
  252. package/static/chunk-4FJUCMEG.js +1 -0
  253. package/static/chunk-4GCCF6PF.js +1 -0
  254. package/static/chunk-4ORP3SBY.js +1 -0
  255. package/static/chunk-4QBOHIC3.js +1 -0
  256. package/static/chunk-4YT6K5KY.js +1 -0
  257. package/static/chunk-556I6YIW.js +1 -0
  258. package/static/chunk-5DPIGJU4.js +1 -0
  259. package/static/chunk-5HNQLBSW.js +3 -0
  260. package/static/chunk-5IL7C45D.js +1 -0
  261. package/static/chunk-5KJXGMKR.js +1 -0
  262. package/static/chunk-5SPGSHKL.js +1 -0
  263. package/static/chunk-5WCQBTXW.js +1 -0
  264. package/static/chunk-5XUIPWOH.js +1 -0
  265. package/static/chunk-62WT7PI3.js +1 -0
  266. package/static/chunk-6F6OMQ5H.js +1 -0
  267. package/static/chunk-6I5BGQHT.js +1 -0
  268. package/static/chunk-6NOS45DG.js +1 -0
  269. package/static/chunk-6OKLPRCD.js +1 -0
  270. package/static/chunk-6VEJCG43.js +1 -0
  271. package/static/chunk-77SS36Z2.js +1 -0
  272. package/static/chunk-7AXEPO3G.js +1 -0
  273. package/static/chunk-7CFSJ4BO.js +1 -0
  274. package/static/chunk-7CKHC72R.js +1 -0
  275. package/static/chunk-7DUTYOJG.js +1 -0
  276. package/static/chunk-7HKFYRPF.js +1 -0
  277. package/static/chunk-7NZJZATZ.js +1 -0
  278. package/static/chunk-AADK5D2H.js +1 -0
  279. package/static/chunk-ACUF7IKP.js +1 -0
  280. package/static/chunk-AGREZPV4.js +1 -0
  281. package/static/chunk-ATBJWFA3.js +1 -0
  282. package/static/chunk-ATXLZN2B.js +1 -0
  283. package/static/chunk-AZ5TF5Y3.js +1 -0
  284. package/static/chunk-BBHYIURC.js +1 -0
  285. package/static/chunk-BHZEPHRI.js +13 -0
  286. package/static/chunk-BQZWSZNN.js +1 -0
  287. package/static/chunk-BSB4VROD.js +2 -0
  288. package/static/chunk-BYWSTP3P.js +1 -0
  289. package/static/chunk-C3AAEQKW.js +1 -0
  290. package/static/chunk-CCGGCHGN.js +1 -0
  291. package/static/chunk-CFTKW432.js +1 -0
  292. package/static/chunk-CNOVT6KU.js +1 -0
  293. package/static/chunk-D56H3XE2.js +1 -0
  294. package/static/chunk-DFOOSIIA.js +1 -0
  295. package/static/chunk-DHFQIFOF.js +1 -0
  296. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  297. package/static/chunk-DJDRX53V.js +2 -0
  298. package/static/chunk-DKGXUMLT.js +1 -0
  299. package/static/chunk-DRHPEERW.js +2 -0
  300. package/static/chunk-DWYP6ZGG.js +1 -0
  301. package/static/chunk-EDJAISWO.js +13 -0
  302. package/static/chunk-EIYRBM4J.js +1 -0
  303. package/static/chunk-EKEGRXCV.js +7 -0
  304. package/static/chunk-EL6QL4TP.js +1 -0
  305. package/static/chunk-ERDZ7IVF.js +1 -0
  306. package/static/chunk-EVQKKVUZ.js +1 -0
  307. package/static/chunk-F2XG7EWI.js +1 -0
  308. package/static/chunk-F672FY5I.js +1 -0
  309. package/static/chunk-F6V37MKG.js +1 -0
  310. package/static/chunk-F7TXTNZC.js +1 -0
  311. package/static/chunk-FCGTI42I.js +1 -0
  312. package/static/chunk-FQHOSSCO.js +1 -0
  313. package/static/chunk-FTSIPHMG.js +1 -0
  314. package/static/chunk-GAGHHYLF.js +1 -0
  315. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  316. package/static/chunk-H6WOTGQ5.js +1 -0
  317. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  318. package/static/chunk-HC7F57NA.js +1 -0
  319. package/static/chunk-HHWXIK2M.js +7 -0
  320. package/static/chunk-HKRGIRKB.js +3 -0
  321. package/static/chunk-HNMGPG72.js +1 -0
  322. package/static/chunk-HS4S6BV3.js +1 -0
  323. package/static/chunk-IJ7K7ATQ.js +1 -0
  324. package/static/chunk-IOIBQGHN.js +562 -0
  325. package/static/chunk-ITVA26X2.js +2 -0
  326. package/static/chunk-J6YSFHLZ.js +1 -0
  327. package/static/chunk-JAEJ6IMV.js +1 -0
  328. package/static/chunk-JB5R6V33.js +1 -0
  329. package/static/chunk-JF6WIV6M.js +1 -0
  330. package/static/chunk-JGB4LLUT.js +1 -0
  331. package/static/chunk-JGXVTKLG.js +1 -0
  332. package/static/chunk-JMYAD7E2.js +1 -0
  333. package/static/chunk-JSE63Q5X.js +1 -0
  334. package/static/chunk-JVV3ZL6L.js +1 -0
  335. package/static/chunk-JXZCNFW7.js +1 -0
  336. package/static/chunk-KAVP6UXH.js +1 -0
  337. package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
  338. package/static/chunk-KHRF67SG.js +1 -0
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KNZ3AQPR.js +1 -0
  342. package/static/chunk-KT3TWCST.js +1 -0
  343. package/static/chunk-L6SYG23T.js +1 -0
  344. package/static/chunk-LJSVNPPQ.js +1 -0
  345. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  346. package/static/chunk-LRQSPCYZ.js +1 -0
  347. package/static/chunk-LUSVISM6.js +1 -0
  348. package/static/chunk-LXQGVNU2.js +1 -0
  349. package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
  350. package/static/chunk-LZKI5P5T.js +1 -0
  351. package/static/chunk-M4XL3JN5.js +6 -0
  352. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  353. package/static/chunk-MKUUWY6Y.js +1 -0
  354. package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
  355. package/static/chunk-MR3U7TKQ.js +1 -0
  356. package/static/chunk-MRF3CNLZ.js +1 -0
  357. package/static/chunk-MRMSMTWD.js +1 -0
  358. package/static/chunk-MVZJSG5R.js +1 -0
  359. package/static/chunk-MYM43ENO.js +1 -0
  360. package/static/chunk-N3P6P6GW.js +7 -0
  361. package/static/chunk-NAH4V2R6.js +2 -0
  362. package/static/chunk-NBBDVVUF.js +1 -0
  363. package/static/chunk-NMF2ZFBE.js +1 -0
  364. package/static/chunk-NN4ONTOT.js +1 -0
  365. package/static/chunk-NOPACN4F.js +1 -0
  366. package/static/chunk-NYJPOP4L.js +1 -0
  367. package/static/chunk-OJCAIKUK.js +1 -0
  368. package/static/chunk-OQRWXCLY.js +1 -0
  369. package/static/chunk-PCFH5HCI.js +2 -0
  370. package/static/chunk-PG54TWBO.js +4 -0
  371. package/static/chunk-PJF5XUTO.js +1 -0
  372. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  373. package/static/chunk-PTLYIUFW.js +1 -0
  374. package/static/chunk-PZGLDZZM.js +1 -0
  375. package/static/chunk-Q4VNZGFI.js +1 -0
  376. package/static/chunk-Q556XB3S.js +1 -0
  377. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  378. package/static/chunk-Q7U2VPIS.js +1 -0
  379. package/static/chunk-QM6CQMEX.js +1 -0
  380. package/static/chunk-QMHUIHSR.js +1 -0
  381. package/static/chunk-QNFNXDSX.js +1 -0
  382. package/static/chunk-QVFPHTOH.js +1 -0
  383. package/static/chunk-R4MI25E2.js +1 -0
  384. package/static/chunk-R7JRAR3P.js +1 -0
  385. package/static/chunk-R7PNKQU2.js +1 -0
  386. package/static/chunk-RCAORRB7.js +1 -0
  387. package/static/chunk-RK7XRDNB.js +1 -0
  388. package/static/chunk-RO7SAOLK.js +1 -0
  389. package/static/chunk-RQUUINHV.js +1 -0
  390. package/static/chunk-RT3K6DZR.js +1 -0
  391. package/static/chunk-RUN556VW.js +1 -0
  392. package/static/chunk-RX3YQ67K.js +1 -0
  393. package/static/chunk-S6EVLDHA.js +5 -0
  394. package/static/chunk-S7S5M3AZ.js +1 -0
  395. package/static/chunk-SBLNYV74.js +1 -0
  396. package/static/chunk-SIZCHHUA.js +1 -0
  397. package/static/chunk-SRBOO7AO.js +1 -0
  398. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  399. package/static/chunk-T3YI3BSS.js +1 -0
  400. package/static/chunk-T74SMT7I.js +1 -0
  401. package/static/chunk-TAL3RTTQ.js +1 -0
  402. package/static/chunk-TJZKTNNS.js +1 -0
  403. package/static/chunk-UJTFWZEC.js +1 -0
  404. package/static/chunk-UPGVU5LG.js +1 -0
  405. package/static/chunk-UQ6O3I6W.js +1 -0
  406. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  407. package/static/chunk-VWIRXLNE.js +1 -0
  408. package/static/chunk-VZMVGIVW.js +1 -0
  409. package/static/chunk-VZPCXSRG.js +2 -0
  410. package/static/chunk-WR3MA3L3.js +1 -0
  411. package/static/chunk-XCLK7NJL.js +1 -0
  412. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  413. package/static/chunk-XEGHEUP5.js +1 -0
  414. package/static/chunk-XKEBQNQJ.js +1 -0
  415. package/static/chunk-XOF4UW3S.js +1 -0
  416. package/static/chunk-XOTKK2NJ.js +1 -0
  417. package/static/chunk-XX7JXKA6.js +1 -0
  418. package/static/chunk-Y2I36A4K.js +1 -0
  419. package/static/chunk-Y44XDRM5.js +1 -0
  420. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  421. package/static/chunk-Y5RLD72B.js +1 -0
  422. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  423. package/static/chunk-Y63UUJGJ.js +1 -0
  424. package/static/chunk-YBNAC7QM.js +1 -0
  425. package/static/chunk-YCTCESL4.js +1 -0
  426. package/static/chunk-YMAN4LIU.js +1 -0
  427. package/static/chunk-YTDE6SXT.js +1 -0
  428. package/static/chunk-YZPIUJB3.js +1 -0
  429. package/static/chunk-ZCOWBVOT.js +1 -0
  430. package/static/chunk-ZHRYYMYE.js +1 -0
  431. package/static/chunk-ZNXTOQFG.js +1 -0
  432. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  433. package/static/favicon.ico +0 -0
  434. package/static/index.html +2 -2
  435. package/static/main-3PLRDZTO.js +11 -0
  436. package/static/styles-Q4OZOSSK.css +1 -0
  437. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  438. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  439. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  440. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  441. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  442. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  443. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  444. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  445. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  446. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  447. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  448. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  449. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  450. package/static/assets/codemirror/mode/css/css.js +0 -862
  451. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  452. package/static/assets/codemirror/mode/d/d.js +0 -223
  453. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  454. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  455. package/static/assets/codemirror/mode/django/django.js +0 -356
  456. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  457. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  458. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  459. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  460. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  461. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  462. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  463. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  464. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  465. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  466. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  467. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  468. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  469. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  470. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  471. package/static/assets/codemirror/mode/go/go.js +0 -187
  472. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  473. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  474. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  475. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  476. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  477. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  478. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  479. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  480. package/static/assets/codemirror/mode/http/http.js +0 -113
  481. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  482. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  483. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  484. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  485. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  486. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  487. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  488. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  489. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  490. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  491. package/static/assets/codemirror/mode/meta.js +0 -221
  492. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  493. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  494. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  495. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  496. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  497. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  498. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  499. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  500. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  501. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  502. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  503. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  504. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  505. package/static/assets/codemirror/mode/php/php.js +0 -234
  506. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  507. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  508. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  509. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  510. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  511. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  512. package/static/assets/codemirror/mode/python/python.js +0 -402
  513. package/static/assets/codemirror/mode/q/q.js +0 -139
  514. package/static/assets/codemirror/mode/r/r.js +0 -190
  515. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  516. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  517. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  518. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  519. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  520. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  521. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  522. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  523. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  524. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  525. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  526. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  527. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  528. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  529. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  530. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  531. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  532. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  533. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  534. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  535. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  536. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  537. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  538. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  539. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  540. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  541. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  542. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  543. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  544. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  545. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  546. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  547. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  548. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  549. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  550. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  551. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  552. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  553. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  554. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  555. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  556. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  557. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  558. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  559. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  560. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  561. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  562. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  563. package/static/chunk-2KLC4T2Z.js +0 -1
  564. package/static/chunk-373XVRXW.js +0 -1
  565. package/static/chunk-3XVM35O2.js +0 -1
  566. package/static/chunk-3YVRP3VM.js +0 -2
  567. package/static/chunk-AF24EYXU.js +0 -1
  568. package/static/chunk-AKQVEHO6.js +0 -2
  569. package/static/chunk-AY2SZ3G6.js +0 -1
  570. package/static/chunk-BCVX464U.js +0 -2
  571. package/static/chunk-C36MW4ME.js +0 -562
  572. package/static/chunk-DKSEQTMX.js +0 -1
  573. package/static/chunk-FZ3JPGYZ.js +0 -1
  574. package/static/chunk-GUGNR5TF.js +0 -3
  575. package/static/chunk-H6NE33VX.js +0 -1
  576. package/static/chunk-HNQRZALS.js +0 -1
  577. package/static/chunk-JSWCNGXJ.js +0 -1
  578. package/static/chunk-KFJIQIGR.js +0 -1
  579. package/static/chunk-LVM4QB22.js +0 -1
  580. package/static/chunk-M3XVNQZQ.js +0 -1
  581. package/static/chunk-MFLIJH6T.js +0 -1
  582. package/static/chunk-MSUHTBB2.js +0 -1
  583. package/static/chunk-N3U6637P.js +0 -1
  584. package/static/chunk-NNV4OXSB.js +0 -1
  585. package/static/chunk-NO2LTNW3.js +0 -1
  586. package/static/chunk-OOGP4WSH.js +0 -2
  587. package/static/chunk-PCWDQPOM.js +0 -2
  588. package/static/chunk-PGZZP5W3.js +0 -1
  589. package/static/chunk-Q5KM7LTX.js +0 -1
  590. package/static/chunk-QHC6ZPQ4.js +0 -1
  591. package/static/chunk-QZU2S5CV.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SHIVUDP3.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-TPYBFZS5.js +0 -1
  597. package/static/chunk-UEQCWMXD.js +0 -1
  598. package/static/chunk-UG5DMXYO.js +0 -1
  599. package/static/chunk-UJPPR4MX.js +0 -1
  600. package/static/chunk-V3AT2BKP.js +0 -1
  601. package/static/chunk-VKK5BSLX.js +0 -1
  602. package/static/chunk-WJW7CT6G.js +0 -27
  603. package/static/chunk-X5XGK6T7.js +0 -4
  604. package/static/chunk-YEKR5OPO.js +0 -1
  605. package/static/chunk-YW57T2PF.js +0 -1
  606. package/static/chunk-Z5J5F5SX.js +0 -1
  607. package/static/chunk-ZPF2DSQV.js +0 -1
  608. package/static/chunk-ZTCRGJ6Y.js +0 -7
  609. package/static/main-VOL6OMJ5.js +0 -9
  610. package/static/scripts-WRDOQIU5.js +0 -24
  611. package/static/styles-2C2UNCNB.css +0 -1
package/CHANGELOG.md CHANGED
@@ -1,16 +1,70 @@
1
- ## [1.8.0](https://github.com/Sync-in/server/compare/v1.7.0...v1.8.0) (2025-10-26)
2
1
 
3
- ### Highlights
2
+ ## [1.9.0](https://github.com/Sync-in/server/compare/v1.8.1...v1.9.0) (2025-11-24)
3
+
4
+ ### Highlights 1.9
5
+
6
+ * 🎨 **Visual identity updated** — refreshed branding.
7
+ * 🖼️ **Enhanced image viewer** — browse all images in a directory, start slideshows, use fullscreen mode, and view detailed properties.
8
+ * ✏️ **Native text editor** — search, syntax highlighting, undo/redo, and lock/unlock capabilities built directly into the UI.
9
+ * 🔐 **Improved file lock management** — users can request unlocks from lock owners, and file owners can now remove locks themselves.
10
+ * ⚠️ **Overwrite confirmation dialogs** — added confirmation prompts for uploads, renaming, copying, and moving files to prevent accidental overwrites.
11
+
12
+ ➡️ [More details](https://sync-in.com/news/sync-in-server-1-9)
13
+
14
+
15
+ ### Features
16
+
17
+ * **admin:** add server update notification support ([fc72430](https://github.com/Sync-in/server/commit/fc72430d69b9d2fb31d24ef680efd602a2c94d87))
18
+ * **backend:auth:** allow cn LDAP attribute and add AD-specific logic ([6998b1a](https://github.com/Sync-in/server/commit/6998b1af24bc6a360a146f71d8d264c582e89edc))
19
+ * **backend:auth:** Allow the LDAP `mail` attribute to be used as the login attribute, and allow users to authenticate using either the login attribute or their email address ([a683b57](https://github.com/Sync-in/server/commit/a683b5760ce9386b51c7e21e8699bb8a8d9335c5))
20
+ * **backend:files:** improve file upload handling with comprehensive overwrite support and directory conflict resolution ([e69a687](https://github.com/Sync-in/server/commit/e69a687071c0d5e7fc8bd76cef820c87a35e852c))
21
+ * **docker:onlyoffice:** update DocumentServer image to v9.1 ([c64a3ae](https://github.com/Sync-in/server/commit/c64a3aeafc70b275acc9d2fa50a5b30517325673))
22
+ * **files:** add directory size retrieval with UI and API integration ([4528b43](https://github.com/Sync-in/server/commit/4528b438e0819d3e6d9f72c11fab931257cadad0))
23
+ * **files:** add overwrite confirmation dialog for file rename and update API to support overwrite behavior ([c7c0d96](https://github.com/Sync-in/server/commit/c7c0d96d46144062cda739e8f32726f27deb8911))
24
+ * **files:** add overwrite confirmation dialog for file uploads and adapt API to support overwrite functionality ([d39822f](https://github.com/Sync-in/server/commit/d39822fd2d787b2b3477214c5ab885e7f712264e))
25
+ * **files:** add unlock request feature and enable force unlock for file owners ([7441337](https://github.com/Sync-in/server/commit/7441337dd0035ef681ece616d3e21870134ea511))
26
+ * **files:** enable locking and unlocking of edited files with improved handling and UI integration ([24ad66b](https://github.com/Sync-in/server/commit/24ad66b034e3287a5bc81c504b383539e025fc10))
27
+ * **files:** improve file handling with edit mode toggle, unsaved changes warning, enhanced modal logic, and updated constants ([bcc3ad2](https://github.com/Sync-in/server/commit/bcc3ad28bd26b042de50506c6a5bb71aa1e720ca))
28
+ * **frontend:config:** enhance notifications with `maxOpened` and `autoDismiss` properties ([cf850bf](https://github.com/Sync-in/server/commit/cf850bf43f61306e7bb2ee5306741f2628f2d89a))
29
+ * **frontend:files:** add ability to edit basic text files ([85b56e2](https://github.com/Sync-in/server/commit/85b56e23d5c8c11ed62ef281bc2370965090305f))
30
+ * **frontend:files:** add fulscreen button in image viewer ([b834618](https://github.com/Sync-in/server/commit/b8346182fd3d01061573111bf80ba9aecca86e23))
31
+ * **frontend:files:** add new translations and improve text viewer with updated read-only state handling and line wrapping ([e90c91e](https://github.com/Sync-in/server/commit/e90c91ec48e0d46cbbb4245a0e2fc53549cc8e3a))
32
+ * **frontend:files:** add overwrite confirmation dialog for copy/move actions ([fa2d601](https://github.com/Sync-in/server/commit/fa2d601aba4aa0ad1e4f7142212ee64db3e73a96))
33
+ * **frontend:files:** add undo and redo functionality with i18n updates and improved editor error handling ([daccfbc](https://github.com/Sync-in/server/commit/daccfbcf7c01fe71421c696a4857a966f9bfef9b))
34
+ * **frontend:files:** enhance overwrite handling by updating MIME type on rename and improving file model consistency and UI visuals ([f68a073](https://github.com/Sync-in/server/commit/f68a07395487dd27779fa9ec52943ccbd7e1f722))
35
+ * **frontend:files:** enhance text viewer with search panel toggle and keyboard shortcuts handling ([5b411f0](https://github.com/Sync-in/server/commit/5b411f084913ab2ece2d499d85e3fab3b1c26f29))
36
+ * **frontend:files:** image viewer slideshow ([49bbd4e](https://github.com/Sync-in/server/commit/49bbd4e2ea325832e30a97b969b3043c8d294ebc))
37
+ * **frontend:files:** improve text viewer with line wrapping, saving state, and enhanced search panel handling ([e5f0863](https://github.com/Sync-in/server/commit/e5f0863bbd921ef97879ff076475aaa46a21d051))
38
+ * **frontend:files:** improve text viewer with save error handling and updated file upload logic ([034c7a4](https://github.com/Sync-in/server/commit/034c7a4db4961433c2d9223229edbee345f2ee67))
39
+ * **frontend:files:** start implementing image viewer and folder slideshow ([7a65927](https://github.com/Sync-in/server/commit/7a65927bc3bcfee88372f0a913db68c0daa1f768))
40
+ * **frontend:links:** update navigation to enter spaces and shares directly instead of selecting them ([fd64265](https://github.com/Sync-in/server/commit/fd6426566c0275daaf82dc4ae21809e6682b90b8))
41
+ * **frontend:modals:** improve modal animations, lifecycle handling, and state management ([bad0696](https://github.com/Sync-in/server/commit/bad06964b65586b751ce0c9cd4e163d921828a63))
4
42
 
5
- * 🌍 **14 languages supported** — added 12 new ones: 🇩🇪 🇪🇸 🇵🇹 🇧🇷 🇮🇹 🇨🇳 🇮🇳 🇹🇷 🇯🇵 🇰🇷 🇵🇱 🇷🇺
6
- * ⚡ **Better suited for small systems** – reduced the default number of backend workers from **2 to 1** to improve memory efficiency on lightweight
7
- setups (e.g. Raspberry Pi).
8
- * 🔍 **Indexing & search controls** — new config to enable/disable indexing, per-space toggles, and full-text search preferences.
9
- * 📊 **Quotas** — define storage quotas for external shares; storage from anchored external locations now counts toward the space’s total usage.
10
- * 🖼️ **Thumbnails** — photo thumbnail generation is now **3× faster**.
11
- * 🐳 **Docker** — minimized system dependencies for a **lighter and more efficient image**.
12
43
 
13
- ➡️ [More details](https://sync-in.com/news/sync-in-server-1-8)
44
+ ### Bug Fixes
45
+
46
+ * **backend:common:** prevent errors on invalid image metadata with `failOn: 'none'` option in sharp ([901fdf8](https://github.com/Sync-in/server/commit/901fdf8cf9ede111cd821363a2a28470c5d9d314))
47
+ * **backend:files:** avoid copy failures when sample documents are read-only and files are written to a CIFS share by falling back to stream copy ([3b734b8](https://github.com/Sync-in/server/commit/3b734b82b8d02072aa09d941ffd7b911cfcf3950))
48
+ * **backend:files:** correct `isDir` SQL logic to handle external paths without associated file IDs ([b3ce7d4](https://github.com/Sync-in/server/commit/b3ce7d4ae66556d455bc5d5495ed2fe070c15efc))
49
+ * **backend:files:** correct directory flag and ensure consistent file move operation in trash handling ([e85ead7](https://github.com/Sync-in/server/commit/e85ead7e7f8a327466279af2d103d3a4d5644b80))
50
+ * **backend:files:** enable `cacheControl` to ensure consistent client-side caching behavior ([25ab568](https://github.com/Sync-in/server/commit/25ab56808b7f4507a09c570bc7e7623077d5c594))
51
+ * **backend:files:** ensure locks are visible on anchored and shared files ([6445333](https://github.com/Sync-in/server/commit/64453339e1ae7f4e8a8e8f061effbccaf5070aa6))
52
+ * **backend:files:** set `maxAge` to 0 to enforce immediate cache invalidation ([293f34c](https://github.com/Sync-in/server/commit/293f34cb0e4bf7ac46bde6b4dc2a2432c57c04ec))
53
+ * **backend:links:** restore access to anchored files from an external location when shared via a link ([f61f09f](https://github.com/Sync-in/server/commit/f61f09fdeefaff2492ae39423ef0958962562db3))
54
+ * **backend:shares:** ensure correct file path for root space shares owned by user ([f5adb55](https://github.com/Sync-in/server/commit/f5adb55612622875ccfcb29ebcc754c974f186fd))
55
+ * **backend:websocket:** prevent server connection from closing on shutdown hooks ([8714644](https://github.com/Sync-in/server/commit/8714644f4d6d35d8d9297bc2f47e2e3eed485938))
56
+ * **frontend:drag:** prevent drag-and-drop actions in the shares list and ensure proper drag event handling ([f19ab4f](https://github.com/Sync-in/server/commit/f19ab4f7ed976d909cda323f1839d458a895ec3d))
57
+ * **frontend:files:** sync read-only value with opening mode in the text editor ([dfff2dc](https://github.com/Sync-in/server/commit/dfff2dcf152e049e25a3f07f92a41ea4a8af4805))
58
+
59
+ ## [1.8.1](https://github.com/Sync-in/server/compare/v1.8.0...v1.8.1) (2025-10-30)
60
+
61
+ ### Bug Fixes
62
+
63
+ * **backend:files:** lower PDF.js verbosity to reduce logging noise ([336fce8](https://github.com/Sync-in/server/commit/336fce8d6b9f2873c10bfaf3a7ca226eb3cb6069))
64
+ * **backend:users:** handle graceful shutdown in WebSocket gateway to prevent new connections during app termination ([0f02820](https://github.com/Sync-in/server/commit/0f02820a291fd5764e928a00cd540514ddfc5ad3))
65
+ * **backend:** update router options access to use `options.routerOptions` instead of deprecated `constraints` property (Fastify v6 compatibility) ([2d74512](https://github.com/Sync-in/server/commit/2d74512a800ba7d80e043679249ec98d3ab6f180))
66
+
67
+ ## [1.8.0](https://github.com/Sync-in/server/compare/v1.7.0...v1.8.0) (2025-10-26)
14
68
 
15
69
  ### Features
16
70
 
@@ -19,10 +19,10 @@ logger:
19
19
  # stdout: if false logs are written to the run directory
20
20
  # default: `true`
21
21
  stdout: true
22
- # colorize output
22
+ # Colorize output.
23
23
  # default: `true`
24
24
  colorize: true
25
- # path to the log file used when stdout is set to false
25
+ # Path to the log file used when stdout is set to false
26
26
  filePath:
27
27
  mysql:
28
28
  # required
@@ -33,20 +33,20 @@ cache:
33
33
  # adapter: `mysql` | `redis`
34
34
  # default: `mysql`
35
35
  adapter: mysql
36
- # ttl in seconds
36
+ # TTL in seconds
37
37
  # default: `60`
38
38
  ttl: 60
39
- # redis adapter url
39
+ # Redis adapter url
40
40
  # default: `redis://127.0.0.1:6379`
41
41
  redis: redis://127.0.0.1:6379
42
42
  websocket:
43
43
  # adapter: `cluster` (Node.js Workers: default) | `redis`
44
44
  # default: `cluster`
45
45
  adapter: cluster
46
- # cors origin allowed
46
+ # Cors origin allowed
47
47
  # default: `*`
48
48
  corsOrigin: '*'
49
- # redis adapter url
49
+ # Redis adapter url
50
50
  # default: `redis://127.0.0.1:6379`
51
51
  redis: redis://127.0.0.1:6379
52
52
  mail:
@@ -59,9 +59,9 @@ mail:
59
59
  auth:
60
60
  user: user
61
61
  pass: password
62
- # secure: defines if the connection should use SSL (if true) or not (if false)
63
- # note: setting `secure: false` does not necessarily mean messages are sent in plaintext
64
- # if the server supports STARTTLS, the connection is usually upgraded to TLS automatically
62
+ # Defines if the connection should use SSL (if true) or not (if false)
63
+ # Note: setting `secure: false` does not necessarily mean messages are sent in plaintext
64
+ # If the server supports STARTTLS, the connection is usually upgraded to TLS automatically
65
65
  # default: `false`
66
66
  secure: false
67
67
  # ignoreTLS: if true, disables the use of STARTTLS even if the server advertises it
@@ -70,28 +70,28 @@ mail:
70
70
  # rejectUnauthorized: reject the connection if the server's TLS certificate is invalid
71
71
  # default: false
72
72
  rejectUnauthorized: false
73
- # enable logger
73
+ # Enable logger
74
74
  # default: `false`
75
75
  logger: false
76
- # set log level to debug
76
+ # Set log level to debug
77
77
  # default: `false`
78
78
  debug: false
79
79
  auth:
80
80
  # adapter : `mysql` | `ldap`
81
81
  # default: `mysql`
82
82
  method: mysql
83
- # key used to encrypt user secret keys in the database
84
- # optional, but strongly recommended
85
- # warning: do not change or remove the encryption key after MFA activation, or the codes will become invalid
83
+ # Key used to encrypt user secret keys in the database
84
+ # Optional but strongly recommended
85
+ # Warning: do not change or remove the encryption key after MFA activation, or the codes will become invalid
86
86
  encryptionKey: changeEncryptionKeyWithStrongKey
87
- # multifactor authentication
87
+ # Multifactor authentication
88
88
  mfa:
89
- # totp configuration
89
+ # TOTP configuration
90
90
  totp:
91
- # enable TOTP authentication
91
+ # Enable TOTP authentication
92
92
  # default: true
93
93
  enabled: true
94
- # name displayed in the authentication app (FreeOTP, Proton Authenticator, Aegis Authenticator etc.)
94
+ # Name displayed in the authentication app (FreeOTP, Proton Authenticator, Aegis Authenticator etc.)
95
95
  # default: Sync-in
96
96
  issuer: Sync-in
97
97
  # cookie sameSite setting: `lax` | `strict`
@@ -99,14 +99,14 @@ auth:
99
99
  cookieSameSite: strict
100
100
  token:
101
101
  access:
102
- # used for token and cookie signatures
102
+ # Used for token and cookie signatures
103
103
  # required
104
104
  secret: changeAccessWithStrongSecret
105
105
  # token expiration = cookie maxAge
106
106
  # default: `30m`
107
107
  expiration: 30m
108
108
  refresh:
109
- # used for token and cookie signatures
109
+ # Used for token and cookie signatures
110
110
  # required
111
111
  secret: changeRefreshWithStrongSecret
112
112
  # token expiration = cookie maxAge
@@ -120,10 +120,13 @@ auth:
120
120
  # filter, e.g: (acl=admin)
121
121
  filter:
122
122
  attributes:
123
- # login attribute: `uid` | `sAMAccountName` | `userPrincipalName`, used to authenticate the user
123
+ # Login attribute used to construct the user's DN for binding.
124
+ # The value of this attribute is used as the naming attribute (first RDN) when forming the Distinguished Name (DN) during authentication
125
+ # login: `uid` | `cn` | `mail` | `sAMAccountName` | `userPrincipalName`, used to authenticate the user
124
126
  # default: `uid`
125
127
  login: uid
126
- # email attribute: `mail` or `email`
128
+ # Attribute used to retrieve the user's email address
129
+ # email: `mail` or `email`
127
130
  # default: `mail`
128
131
  email: mail
129
132
  # adminGroup: The CN of a group containing Sync-in administrators (e.g., administrators)
@@ -148,14 +151,14 @@ applications:
148
151
  # enable onlyoffice integration
149
152
  # default: false
150
153
  enabled: false
151
- # for an external server (e.g., https://onlyoffice.domain.com), remember the url must be accessible from browser !
152
- # if externalServer is empty (case of official docker compose), we use the local instance
154
+ # For an external server (e.g., https://onlyoffice.domain.com), remember the url must be accessible from browser!
155
+ # If externalServer is empty (case of official docker compose), we use the local instance
153
156
  # default: null
154
157
  externalServer:
155
- # secret used for jwt tokens, it must be the same on the onlyoffice server
158
+ # Secret used for jwt tokens, it must be the same on the onlyoffice server
156
159
  # required
157
160
  secret: onlyOfficeSecret
158
- # if you use https, set to `true`
161
+ # If you use https, set to `true`.
159
162
  # default: `false`
160
163
  verifySSL: false
161
164
  appStore:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sync-in/server",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "description": "The secure, open-source platform for file storage, sharing, collaboration, and sync",
5
5
  "author": {
6
6
  "name": "Johan Legrand",
@@ -74,35 +74,35 @@
74
74
  "dependencies": {
75
75
  "@fastify/cookie": "11.0.2",
76
76
  "@fastify/helmet": "13.0.2",
77
- "@fastify/multipart": "9.2.1",
77
+ "@fastify/multipart": "9.3.0",
78
78
  "@fastify/send": "4.1.0",
79
79
  "@fastify/static": "8.3.0",
80
80
  "@knaadh/nestjs-drizzle-mysql2": "1.2.0",
81
81
  "@lukeed/ms": "2.0.2",
82
82
  "@nestjs/axios": "4.0.1",
83
- "@nestjs/common": "11.1.7",
83
+ "@nestjs/common": "11.1.9",
84
84
  "@nestjs/config": "4.0.2",
85
- "@nestjs/core": "11.1.7",
85
+ "@nestjs/core": "11.1.9",
86
86
  "@nestjs/jwt": "11.0.1",
87
87
  "@nestjs/passport": "11.0.5",
88
- "@nestjs/platform-fastify": "11.1.7",
89
- "@nestjs/platform-socket.io": "11.1.7",
88
+ "@nestjs/platform-fastify": "11.1.9",
89
+ "@nestjs/platform-socket.io": "11.1.9",
90
90
  "@nestjs/schedule": "6.0.1",
91
- "@nestjs/websockets": "11.1.7",
92
- "@resvg/resvg-js": "2.6.2",
91
+ "@nestjs/websockets": "11.1.9",
93
92
  "@socket.io/cluster-adapter": "0.3.0",
94
93
  "@socket.io/redis-adapter": "8.3.0",
94
+ "@types/text-to-svg": "3.1.4",
95
95
  "archiver": "7.0.1",
96
- "bcryptjs": "3.0.2",
96
+ "bcryptjs": "3.0.3",
97
97
  "class-transformer": "0.5.1",
98
98
  "class-validator": "0.14.2",
99
99
  "deepmerge": "4.3.1",
100
- "drizzle-kit": "0.31.5",
100
+ "drizzle-kit": "0.31.7",
101
101
  "drizzle-orm": "0.44.7",
102
- "fast-xml-parser": "5.3.0",
102
+ "fast-xml-parser": "5.3.2",
103
103
  "fs-extra": "11.3.2",
104
104
  "html-to-text": "9.0.5",
105
- "js-yaml": "4.1.0",
105
+ "js-yaml": "4.1.1",
106
106
  "ldapts": "8.0.9",
107
107
  "mime-types": "3.0.1",
108
108
  "mysql2": "3.15.3",
@@ -112,15 +112,16 @@
112
112
  "passport-jwt": "4.0.1",
113
113
  "passport-local": "1.0.0",
114
114
  "passport": "0.7.0",
115
- "pdfjs-dist": "5.4.296",
116
115
  "pino-pretty": "13.1.2",
117
116
  "qrcode-generator": "2.0.4",
118
- "redis": "5.9.0",
119
- "sax": "1.4.1",
120
- "sharp": "0.34.4",
117
+ "redis": "5.10.0",
118
+ "sax": "1.4.3",
119
+ "sharp": "0.34.5",
121
120
  "socket.io": "4.8.1",
122
- "tar": "7.5.1",
121
+ "tar": "7.5.2",
122
+ "text-to-svg": "3.1.5",
123
123
  "time2fa": "1.4.2",
124
+ "unpdf": "1.4.0",
124
125
  "yauzl": "3.2.0"
125
126
  }
126
127
  }
@@ -35,8 +35,10 @@ async function appBootstrap() {
35
35
  /* APP */ const fastifyAdapter = new _platformfastify.FastifyAdapter({
36
36
  logger: false,
37
37
  trustProxy: _configenvironment.configuration.server.trustProxy,
38
- ignoreTrailingSlash: true,
39
- maxParamLength: 256,
38
+ routerOptions: {
39
+ ignoreTrailingSlash: true,
40
+ maxParamLength: 256
41
+ },
40
42
  bodyLimit: 26214400 /* 25 MB */
41
43
  });
42
44
  const app = await _core.NestFactory.create(_appmodule.AppModule, fastifyAdapter, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../backend/src/app.bootstrap.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport fastifyCookie from '@fastify/cookie'\nimport fastifyHelmet from '@fastify/helmet'\nimport multipart from '@fastify/multipart'\nimport { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'\nimport { NestFactory, Reflector } from '@nestjs/core'\nimport { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { FastifyRequest } from 'fastify'\nimport { Logger, LoggerErrorInterceptor } from 'nestjs-pino'\nimport { CONTENT_SECURITY_POLICY } from './app.constants'\nimport { AppModule } from './app.module'\nimport { HTTP_WEBDAV_METHOD } from './applications/applications.constants'\nimport { WEBDAV_NS, WEBDAV_SPACES } from './applications/webdav/constants/routes'\nimport { IS_TEST_ENV, STATIC_PATH } from './configuration/config.constants'\nimport { configuration } from './configuration/config.environment'\nimport { WebSocketAdapter } from './infrastructure/websocket/adapters/web-socket.adapter'\n\nexport async function appBootstrap(): Promise<NestFastifyApplication> {\n /* APP */\n const fastifyAdapter = new FastifyAdapter({\n logger: false,\n trustProxy: configuration.server.trustProxy,\n ignoreTrailingSlash: true,\n maxParamLength: 256,\n bodyLimit: 26214400 /* 25 MB */\n })\n const app: NestFastifyApplication = await NestFactory.create<NestFastifyApplication>(AppModule, fastifyAdapter, {\n bufferLogs: true\n })\n\n /* NestJS starts listening for shutdown hooks */\n app.enableShutdownHooks()\n\n /* Fastify instance */\n const fastifyInstance = fastifyAdapter.getInstance()\n\n /* LOGGER */\n app.useLogger(IS_TEST_ENV ? ['fatal'] : app.get(Logger))\n\n /* PARSER */\n // xml body parser is used for webdav methods\n app.useBodyParser(['application/xml', 'text/xml'])\n // add webdav methods\n for (const method of Object.values(HTTP_WEBDAV_METHOD)) {\n fastifyInstance.addHttpMethod(method, { hasBody: true })\n }\n // '*' body parser allow binary data as stream (unlimited body size)\n fastifyInstance.addContentTypeParser('*', { bodyLimit: 0 }, (_req: FastifyRequest, _payload: FastifyRequest['raw'], done) => done(null))\n\n // Joplin clients send incorrect `Content-Type` headers when syncing over WebDAV (issue: https://github.com/laurent22/joplin/issues/122499)\n // This hook intercepts matching requests and sets `application/octet-stream` to ensure compatibility and successful sync.\n // todo: remove it when fixed on Joplin side\n fastifyInstance.addHook('onRequest', async (req, _reply) => {\n if ((req.headers['user-agent'] || '').indexOf('Joplin') !== -1 && req.originalUrl.startsWith(WEBDAV_SPACES[WEBDAV_NS.WEBDAV].route)) {\n req.headers['content-type'] = 'application/octet-stream'\n }\n })\n\n /* INTERCEPTORS */\n app.useGlobalInterceptors(\n new LoggerErrorInterceptor(),\n new ClassSerializerInterceptor(app.get(Reflector), {\n excludePrefixes: ['_']\n })\n )\n /* VALIDATION */\n app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }))\n\n /* STATIC */\n app.useStaticAssets({ root: STATIC_PATH, prefixAvoidTrailingSlash: true })\n\n /* SECURITY */\n await app.register(fastifyHelmet, { contentSecurityPolicy: CONTENT_SECURITY_POLICY(configuration.applications.files.onlyoffice.externalServer) })\n\n /* COOKIES */\n // we use csrf secret to unsign csrf cookie\n await app.register(fastifyCookie, {\n secret: configuration.auth.token.csrf.secret,\n parseOptions: {\n secure: 'auto',\n sameSite: configuration.auth.cookieSameSite,\n httpOnly: true\n }\n })\n\n /* UPLOAD */\n await app.register(multipart, {\n preservePath: true,\n limits: { parts: Infinity, fileSize: configuration.applications.files.maxUploadSize }\n })\n\n /* WEBSOCKET */\n if (!IS_TEST_ENV) {\n const webSocketAdapter = new WebSocketAdapter(app)\n await webSocketAdapter.initAdapter()\n app.useWebSocketAdapter(webSocketAdapter)\n }\n\n return app\n}\n"],"names":["appBootstrap","fastifyAdapter","FastifyAdapter","logger","trustProxy","configuration","server","ignoreTrailingSlash","maxParamLength","bodyLimit","app","NestFactory","create","AppModule","bufferLogs","enableShutdownHooks","fastifyInstance","getInstance","useLogger","IS_TEST_ENV","get","Logger","useBodyParser","method","Object","values","HTTP_WEBDAV_METHOD","addHttpMethod","hasBody","addContentTypeParser","_req","_payload","done","addHook","req","_reply","headers","indexOf","originalUrl","startsWith","WEBDAV_SPACES","WEBDAV_NS","WEBDAV","route","useGlobalInterceptors","LoggerErrorInterceptor","ClassSerializerInterceptor","Reflector","excludePrefixes","useGlobalPipes","ValidationPipe","transform","whitelist","useStaticAssets","root","STATIC_PATH","prefixAvoidTrailingSlash","register","fastifyHelmet","contentSecurityPolicy","CONTENT_SECURITY_POLICY","applications","files","onlyoffice","externalServer","fastifyCookie","secret","auth","token","csrf","parseOptions","secure","sameSite","cookieSameSite","httpOnly","multipart","preservePath","limits","parts","Infinity","fileSize","maxUploadSize","webSocketAdapter","WebSocketAdapter","initAdapter","useWebSocketAdapter"],"mappings":"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"}
1
+ {"version":3,"sources":["../../backend/src/app.bootstrap.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport fastifyCookie from '@fastify/cookie'\nimport fastifyHelmet from '@fastify/helmet'\nimport multipart from '@fastify/multipart'\nimport { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'\nimport { NestFactory, Reflector } from '@nestjs/core'\nimport { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { FastifyRequest } from 'fastify'\nimport { Logger, LoggerErrorInterceptor } from 'nestjs-pino'\nimport { CONTENT_SECURITY_POLICY } from './app.constants'\nimport { AppModule } from './app.module'\nimport { HTTP_WEBDAV_METHOD } from './applications/applications.constants'\nimport { WEBDAV_NS, WEBDAV_SPACES } from './applications/webdav/constants/routes'\nimport { IS_TEST_ENV, STATIC_PATH } from './configuration/config.constants'\nimport { configuration } from './configuration/config.environment'\nimport { WebSocketAdapter } from './infrastructure/websocket/adapters/web-socket.adapter'\n\nexport async function appBootstrap(): Promise<NestFastifyApplication> {\n /* APP */\n const fastifyAdapter = new FastifyAdapter({\n logger: false,\n trustProxy: configuration.server.trustProxy,\n routerOptions: {\n ignoreTrailingSlash: true,\n maxParamLength: 256\n },\n bodyLimit: 26214400 /* 25 MB */\n })\n const app: NestFastifyApplication = await NestFactory.create<NestFastifyApplication>(AppModule, fastifyAdapter, {\n bufferLogs: true\n })\n\n /* NestJS starts listening for shutdown hooks */\n app.enableShutdownHooks()\n\n /* Fastify instance */\n const fastifyInstance = fastifyAdapter.getInstance()\n\n /* LOGGER */\n app.useLogger(IS_TEST_ENV ? ['fatal'] : app.get(Logger))\n\n /* PARSER */\n // xml body parser is used for webdav methods\n app.useBodyParser(['application/xml', 'text/xml'])\n // add webdav methods\n for (const method of Object.values(HTTP_WEBDAV_METHOD)) {\n fastifyInstance.addHttpMethod(method, { hasBody: true })\n }\n // '*' body parser allow binary data as stream (unlimited body size)\n fastifyInstance.addContentTypeParser('*', { bodyLimit: 0 }, (_req: FastifyRequest, _payload: FastifyRequest['raw'], done) => done(null))\n\n // Joplin clients send incorrect `Content-Type` headers when syncing over WebDAV (issue: https://github.com/laurent22/joplin/issues/122499)\n // This hook intercepts matching requests and sets `application/octet-stream` to ensure compatibility and successful sync.\n // todo: remove it when fixed on Joplin side\n fastifyInstance.addHook('onRequest', async (req, _reply) => {\n if ((req.headers['user-agent'] || '').indexOf('Joplin') !== -1 && req.originalUrl.startsWith(WEBDAV_SPACES[WEBDAV_NS.WEBDAV].route)) {\n req.headers['content-type'] = 'application/octet-stream'\n }\n })\n\n /* INTERCEPTORS */\n app.useGlobalInterceptors(\n new LoggerErrorInterceptor(),\n new ClassSerializerInterceptor(app.get(Reflector), {\n excludePrefixes: ['_']\n })\n )\n /* VALIDATION */\n app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }))\n\n /* STATIC */\n app.useStaticAssets({ root: STATIC_PATH, prefixAvoidTrailingSlash: true })\n\n /* SECURITY */\n await app.register(fastifyHelmet, { contentSecurityPolicy: CONTENT_SECURITY_POLICY(configuration.applications.files.onlyoffice.externalServer) })\n\n /* COOKIES */\n // we use csrf secret to unsign csrf cookie\n await app.register(fastifyCookie, {\n secret: configuration.auth.token.csrf.secret,\n parseOptions: {\n secure: 'auto',\n sameSite: configuration.auth.cookieSameSite,\n httpOnly: true\n }\n })\n\n /* UPLOAD */\n await app.register(multipart, {\n preservePath: true,\n limits: { parts: Infinity, fileSize: configuration.applications.files.maxUploadSize }\n })\n\n /* WEBSOCKET */\n if (!IS_TEST_ENV) {\n const webSocketAdapter = new WebSocketAdapter(app)\n await webSocketAdapter.initAdapter()\n app.useWebSocketAdapter(webSocketAdapter)\n }\n\n return app\n}\n"],"names":["appBootstrap","fastifyAdapter","FastifyAdapter","logger","trustProxy","configuration","server","routerOptions","ignoreTrailingSlash","maxParamLength","bodyLimit","app","NestFactory","create","AppModule","bufferLogs","enableShutdownHooks","fastifyInstance","getInstance","useLogger","IS_TEST_ENV","get","Logger","useBodyParser","method","Object","values","HTTP_WEBDAV_METHOD","addHttpMethod","hasBody","addContentTypeParser","_req","_payload","done","addHook","req","_reply","headers","indexOf","originalUrl","startsWith","WEBDAV_SPACES","WEBDAV_NS","WEBDAV","route","useGlobalInterceptors","LoggerErrorInterceptor","ClassSerializerInterceptor","Reflector","excludePrefixes","useGlobalPipes","ValidationPipe","transform","whitelist","useStaticAssets","root","STATIC_PATH","prefixAvoidTrailingSlash","register","fastifyHelmet","contentSecurityPolicy","CONTENT_SECURITY_POLICY","applications","files","onlyoffice","externalServer","fastifyCookie","secret","auth","token","csrf","parseOptions","secure","sameSite","cookieSameSite","httpOnly","multipart","preservePath","limits","parts","Infinity","fileSize","maxUploadSize","webSocketAdapter","WebSocketAdapter","initAdapter","useWebSocketAdapter"],"mappings":"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"}
@@ -18,8 +18,17 @@ _export(exports, {
18
18
  },
19
19
  get CONTENT_SECURITY_POLICY () {
20
20
  return CONTENT_SECURITY_POLICY;
21
+ },
22
+ get USER_AGENT () {
23
+ return USER_AGENT;
24
+ },
25
+ get VERSION () {
26
+ return VERSION;
21
27
  }
22
28
  });
29
+ const _packagejson = require("../../package.json");
30
+ const VERSION = _packagejson.version;
31
+ const USER_AGENT = `sync-in-server/${_packagejson.version}`;
23
32
  const CONTENT_SECURITY_POLICY = (onlyOfficeServer)=>({
24
33
  useDefaults: false,
25
34
  directives: {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../backend/src/app.constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport const CONTENT_SECURITY_POLICY = (onlyOfficeServer: string) => ({\n useDefaults: false,\n directives: {\n defaultSrc: [\"'self'\", onlyOfficeServer || ''],\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", onlyOfficeServer || ''],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:'],\n fontSrc: [\"'self'\"]\n }\n})\n\nexport const CONNECT_ERROR_CODE = new Set(['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'])\n"],"names":["CONNECT_ERROR_CODE","CONTENT_SECURITY_POLICY","onlyOfficeServer","useDefaults","directives","defaultSrc","scriptSrc","styleSrc","imgSrc","fontSrc","Set"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAaYA;eAAAA;;QAXAC;eAAAA;;;AAAN,MAAMA,0BAA0B,CAACC,mBAA8B,CAAA;QACpEC,aAAa;QACbC,YAAY;YACVC,YAAY;gBAAC;gBAAUH,oBAAoB;aAAG;YAC9CI,WAAW;gBAAC;gBAAU;gBAAmBJ,oBAAoB;aAAG;YAChEK,UAAU;gBAAC;gBAAU;aAAkB;YACvCC,QAAQ;gBAAC;gBAAU;aAAQ;YAC3BC,SAAS;gBAAC;aAAS;QACrB;IACF,CAAA;AAEO,MAAMT,qBAAqB,IAAIU,IAAI;IAAC;IAAgB;IAAa;CAAY"}
1
+ {"version":3,"sources":["../../backend/src/app.constants.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\nimport { version } from '../../package.json'\n\nexport const VERSION = version\nexport const USER_AGENT = `sync-in-server/${version}`\nexport const CONTENT_SECURITY_POLICY = (onlyOfficeServer: string) => ({\n useDefaults: false,\n directives: {\n defaultSrc: [\"'self'\", onlyOfficeServer || ''],\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", onlyOfficeServer || ''],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:'],\n fontSrc: [\"'self'\"]\n }\n})\n\nexport const CONNECT_ERROR_CODE = new Set(['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'])\n"],"names":["CONNECT_ERROR_CODE","CONTENT_SECURITY_POLICY","USER_AGENT","VERSION","version","onlyOfficeServer","useDefaults","directives","defaultSrc","scriptSrc","styleSrc","imgSrc","fontSrc","Set"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAgBYA;eAAAA;;QAXAC;eAAAA;;QADAC;eAAAA;;QADAC;eAAAA;;;6BAFW;AAEjB,MAAMA,UAAUC,oBAAO;AACvB,MAAMF,aAAa,CAAC,eAAe,EAAEE,oBAAO,EAAE;AAC9C,MAAMH,0BAA0B,CAACI,mBAA8B,CAAA;QACpEC,aAAa;QACbC,YAAY;YACVC,YAAY;gBAAC;gBAAUH,oBAAoB;aAAG;YAC9CI,WAAW;gBAAC;gBAAU;gBAAmBJ,oBAAoB;aAAG;YAChEK,UAAU;gBAAC;gBAAU;aAAkB;YACvCC,QAAQ;gBAAC;gBAAU;aAAQ;YAC3BC,SAAS;gBAAC;aAAS;QACrB;IACF,CAAA;AAEO,MAAMZ,qBAAqB,IAAIa,IAAI;IAAC;IAAgB;IAAa;CAAY"}
@@ -16,6 +16,7 @@ const _axios = require("@nestjs/axios");
16
16
  const _common = require("@nestjs/common");
17
17
  const _config = require("@nestjs/config");
18
18
  const _nestjspino = require("nestjs-pino");
19
+ const _appconstants = require("./app.constants");
19
20
  const _appservice = require("./app.service");
20
21
  const _applicationsmodule = require("./applications/applications.module");
21
22
  const _authmodule = require("./authentication/auth.module");
@@ -59,6 +60,9 @@ AppModule = _ts_decorate([
59
60
  _applicationsmodule.ApplicationsModule,
60
61
  _axios.HttpModule.register({
61
62
  global: true,
63
+ headers: {
64
+ 'User-Agent': _appconstants.USER_AGENT
65
+ },
62
66
  timeout: 5000,
63
67
  maxRedirects: 5
64
68
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../backend/src/app.module.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpModule } from '@nestjs/axios'\nimport { Module } from '@nestjs/common'\nimport { ConfigModule } from '@nestjs/config'\nimport { LoggerModule } from 'nestjs-pino'\nimport { AppService } from './app.service'\nimport { ApplicationsModule } from './applications/applications.module'\nimport { AuthModule } from './authentication/auth.module'\nimport { configuration, exportConfiguration } from './configuration/config.environment'\nimport { configLogger } from './configuration/config.logger'\nimport { CacheModule } from './infrastructure/cache/cache.module'\nimport { ContextModule } from './infrastructure/context/context.module'\nimport { DatabaseModule } from './infrastructure/database/database.module'\nimport { MailerModule } from './infrastructure/mailer/mailer.module'\nimport { SchedulerModule } from './infrastructure/scheduler/scheduler.module'\n\n@Module({\n imports: [\n ConfigModule.forRoot({ load: [exportConfiguration], validatePredefined: false, ignoreEnvFile: true, isGlobal: true }),\n LoggerModule.forRootAsync({\n useFactory: async () => ({\n pinoHttp: configLogger(configuration.logger)\n })\n }),\n AuthModule,\n DatabaseModule,\n CacheModule,\n MailerModule,\n ContextModule,\n SchedulerModule.register(),\n ApplicationsModule,\n HttpModule.register({\n global: true,\n timeout: 5000,\n maxRedirects: 5\n })\n ],\n providers: [AppService]\n})\nexport class AppModule {}\n"],"names":["AppModule","imports","ConfigModule","forRoot","load","exportConfiguration","validatePredefined","ignoreEnvFile","isGlobal","LoggerModule","forRootAsync","useFactory","pinoHttp","configLogger","configuration","logger","AuthModule","DatabaseModule","CacheModule","MailerModule","ContextModule","SchedulerModule","register","ApplicationsModule","HttpModule","global","timeout","maxRedirects","providers","AppService"],"mappings":"AAAA;;;;CAIC;;;;+BAwCYA;;;eAAAA;;;uBAtCc;wBACJ;wBACM;4BACA;4BACF;oCACQ;4BACR;mCACwB;8BACtB;6BACD;+BACE;gCACC;8BACF;iCACG;;;;;;;AAyBzB,IAAA,AAAMA,YAAN,MAAMA;AAAW;;;QAtBtBC,SAAS;YACPC,oBAAY,CAACC,OAAO,CAAC;gBAAEC,MAAM;oBAACC,sCAAmB;iBAAC;gBAAEC,oBAAoB;gBAAOC,eAAe;gBAAMC,UAAU;YAAK;YACnHC,wBAAY,CAACC,YAAY,CAAC;gBACxBC,YAAY,UAAa,CAAA;wBACvBC,UAAUC,IAAAA,0BAAY,EAACC,gCAAa,CAACC,MAAM;oBAC7C,CAAA;YACF;YACAC,sBAAU;YACVC,8BAAc;YACdC,wBAAW;YACXC,0BAAY;YACZC,4BAAa;YACbC,gCAAe,CAACC,QAAQ;YACxBC,sCAAkB;YAClBC,iBAAU,CAACF,QAAQ,CAAC;gBAClBG,QAAQ;gBACRC,SAAS;gBACTC,cAAc;YAChB;SACD;QACDC,WAAW;YAACC,sBAAU;SAAC"}
1
+ {"version":3,"sources":["../../backend/src/app.module.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpModule } from '@nestjs/axios'\nimport { Module } from '@nestjs/common'\nimport { ConfigModule } from '@nestjs/config'\nimport { LoggerModule } from 'nestjs-pino'\nimport { USER_AGENT } from './app.constants'\nimport { AppService } from './app.service'\nimport { ApplicationsModule } from './applications/applications.module'\nimport { AuthModule } from './authentication/auth.module'\nimport { configuration, exportConfiguration } from './configuration/config.environment'\nimport { configLogger } from './configuration/config.logger'\nimport { CacheModule } from './infrastructure/cache/cache.module'\nimport { ContextModule } from './infrastructure/context/context.module'\nimport { DatabaseModule } from './infrastructure/database/database.module'\nimport { MailerModule } from './infrastructure/mailer/mailer.module'\nimport { SchedulerModule } from './infrastructure/scheduler/scheduler.module'\n\n@Module({\n imports: [\n ConfigModule.forRoot({ load: [exportConfiguration], validatePredefined: false, ignoreEnvFile: true, isGlobal: true }),\n LoggerModule.forRootAsync({\n useFactory: async () => ({\n pinoHttp: configLogger(configuration.logger)\n })\n }),\n AuthModule,\n DatabaseModule,\n CacheModule,\n MailerModule,\n ContextModule,\n SchedulerModule.register(),\n ApplicationsModule,\n HttpModule.register({\n global: true,\n headers: {\n 'User-Agent': USER_AGENT\n },\n timeout: 5000,\n maxRedirects: 5\n })\n ],\n providers: [AppService]\n})\nexport class AppModule {}\n"],"names":["AppModule","imports","ConfigModule","forRoot","load","exportConfiguration","validatePredefined","ignoreEnvFile","isGlobal","LoggerModule","forRootAsync","useFactory","pinoHttp","configLogger","configuration","logger","AuthModule","DatabaseModule","CacheModule","MailerModule","ContextModule","SchedulerModule","register","ApplicationsModule","HttpModule","global","headers","USER_AGENT","timeout","maxRedirects","providers","AppService"],"mappings":"AAAA;;;;CAIC;;;;+BA4CYA;;;eAAAA;;;uBA1Cc;wBACJ;wBACM;4BACA;8BACF;4BACA;oCACQ;4BACR;mCACwB;8BACtB;6BACD;+BACE;gCACC;8BACF;iCACG;;;;;;;AA4BzB,IAAA,AAAMA,YAAN,MAAMA;AAAW;;;QAzBtBC,SAAS;YACPC,oBAAY,CAACC,OAAO,CAAC;gBAAEC,MAAM;oBAACC,sCAAmB;iBAAC;gBAAEC,oBAAoB;gBAAOC,eAAe;gBAAMC,UAAU;YAAK;YACnHC,wBAAY,CAACC,YAAY,CAAC;gBACxBC,YAAY,UAAa,CAAA;wBACvBC,UAAUC,IAAAA,0BAAY,EAACC,gCAAa,CAACC,MAAM;oBAC7C,CAAA;YACF;YACAC,sBAAU;YACVC,8BAAc;YACdC,wBAAW;YACXC,0BAAY;YACZC,4BAAa;YACbC,gCAAe,CAACC,QAAQ;YACxBC,sCAAkB;YAClBC,iBAAU,CAACF,QAAQ,CAAC;gBAClBG,QAAQ;gBACRC,SAAS;oBACP,cAAcC,wBAAU;gBAC1B;gBACAC,SAAS;gBACTC,cAAc;YAChB;SACD;QACDC,WAAW;YAACC,sBAAU;SAAC"}
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "AdminModule", {
13
13
  }
14
14
  });
15
15
  const _common = require("@nestjs/common");
16
+ const _adminschedulerservice = require("./services/admin-scheduler.service");
17
+ const _adminservice = require("./services/admin.service");
16
18
  function _ts_decorate(decorators, target, key, desc) {
17
19
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
18
20
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -24,7 +26,10 @@ let AdminModule = class AdminModule {
24
26
  AdminModule = _ts_decorate([
25
27
  (0, _common.Module)({
26
28
  controllers: [],
27
- providers: []
29
+ providers: [
30
+ _adminservice.AdminService,
31
+ _adminschedulerservice.AdminSchedulerService
32
+ ]
28
33
  })
29
34
  ], AdminModule);
30
35
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/admin/admin.module.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Module } from '@nestjs/common'\n\n@Module({\n controllers: [],\n providers: []\n})\nexport class AdminModule {}\n"],"names":["AdminModule","controllers","providers"],"mappings":"AAAA;;;;CAIC;;;;+BAQYA;;;eAAAA;;;wBANU;;;;;;;AAMhB,IAAA,AAAMA,cAAN,MAAMA;AAAa;;;QAHxBC,aAAa,EAAE;QACfC,WAAW,EAAE"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/admin/admin.module.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Module } from '@nestjs/common'\nimport { AdminSchedulerService } from './services/admin-scheduler.service'\nimport { AdminService } from './services/admin.service'\n\n@Module({\n controllers: [],\n providers: [AdminService, AdminSchedulerService]\n})\nexport class AdminModule {}\n"],"names":["AdminModule","controllers","providers","AdminService","AdminSchedulerService"],"mappings":"AAAA;;;;CAIC;;;;+BAUYA;;;eAAAA;;;wBARU;uCACe;8BACT;;;;;;;AAMtB,IAAA,AAAMA,cAAN,MAAMA;AAAa;;;QAHxBC,aAAa,EAAE;QACfC,WAAW;YAACC,0BAAY;YAAEC,4CAAqB;SAAC"}
@@ -7,4 +7,4 @@ Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
 
10
- //# sourceMappingURL=user-mail-notification.js.map
10
+ //# sourceMappingURL=check-update.interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../backend/src/applications/admin/interfaces/check-update.interfaces.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nexport interface ServerReleaseVersionManifest {\n // tag_name: `v1.0.0`\n tag_name: string\n}\n\nexport interface ServerReleaseNotification {\n version: string\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "AdminSchedulerService", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return AdminSchedulerService;
13
+ }
14
+ });
15
+ const _common = require("@nestjs/common");
16
+ const _schedule = require("@nestjs/schedule");
17
+ const _promises = require("node:timers/promises");
18
+ const _adminservice = require("./admin.service");
19
+ function _ts_decorate(decorators, target, key, desc) {
20
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
21
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
22
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
23
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
24
+ }
25
+ function _ts_metadata(k, v) {
26
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
27
+ }
28
+ let AdminSchedulerService = class AdminSchedulerService {
29
+ async checkServerUpdateAndNotify() {
30
+ // Apply a random delay so instances don't trigger the check simultaneously
31
+ const randomDelay = Math.floor(Math.random() * 900 * 1000);
32
+ await (0, _promises.setTimeout)(randomDelay);
33
+ await this.adminService.checkServerUpdateAndNotify();
34
+ }
35
+ constructor(adminService){
36
+ this.adminService = adminService;
37
+ }
38
+ };
39
+ _ts_decorate([
40
+ (0, _schedule.Cron)(_schedule.CronExpression.EVERY_DAY_AT_9AM),
41
+ _ts_metadata("design:type", Function),
42
+ _ts_metadata("design:paramtypes", []),
43
+ _ts_metadata("design:returntype", Promise)
44
+ ], AdminSchedulerService.prototype, "checkServerUpdateAndNotify", null);
45
+ AdminSchedulerService = _ts_decorate([
46
+ (0, _common.Injectable)(),
47
+ _ts_metadata("design:type", Function),
48
+ _ts_metadata("design:paramtypes", [
49
+ typeof _adminservice.AdminService === "undefined" ? Object : _adminservice.AdminService
50
+ ])
51
+ ], AdminSchedulerService);
52
+
53
+ //# sourceMappingURL=admin-scheduler.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../backend/src/applications/admin/services/admin-scheduler.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Injectable } from '@nestjs/common'\nimport { Cron, CronExpression } from '@nestjs/schedule'\nimport { setTimeout } from 'node:timers/promises'\nimport { AdminService } from './admin.service'\n\n@Injectable()\nexport class AdminSchedulerService {\n constructor(private readonly adminService: AdminService) {}\n\n @Cron(CronExpression.EVERY_DAY_AT_9AM)\n async checkServerUpdateAndNotify() {\n // Apply a random delay so instances don't trigger the check simultaneously\n const randomDelay = Math.floor(Math.random() * 900 * 1000)\n await setTimeout(randomDelay)\n await this.adminService.checkServerUpdateAndNotify()\n }\n}\n"],"names":["AdminSchedulerService","checkServerUpdateAndNotify","randomDelay","Math","floor","random","setTimeout","adminService","EVERY_DAY_AT_9AM"],"mappings":"AAAA;;;;CAIC;;;;+BAQYA;;;eAAAA;;;wBANc;0BACU;0BACV;8BACE;;;;;;;;;;AAGtB,IAAA,AAAMA,wBAAN,MAAMA;IAGX,MACMC,6BAA6B;QACjC,2EAA2E;QAC3E,MAAMC,cAAcC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAK,MAAM;QACrD,MAAMC,IAAAA,oBAAU,EAACJ;QACjB,MAAM,IAAI,CAACK,YAAY,CAACN,0BAA0B;IACpD;IARA,YAAY,AAAiBM,YAA0B,CAAE;aAA5BA,eAAAA;IAA6B;AAS5D;;iDAPuBC"}
@@ -0,0 +1,102 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "AdminService", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return AdminService;
13
+ }
14
+ });
15
+ const _axios = require("@nestjs/axios");
16
+ const _common = require("@nestjs/common");
17
+ const _appconstants = require("../../../app.constants");
18
+ const _shared = require("../../../common/shared");
19
+ const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
20
+ const _applicationsconstants = require("../../applications.constants");
21
+ const _notifications = require("../../notifications/constants/notifications");
22
+ const _notificationsmanagerservice = require("../../notifications/services/notifications-manager.service");
23
+ const _adminusersqueriesservice = require("../../users/services/admin-users-queries.service");
24
+ const _checkupdate = require("../utils/check-update");
25
+ function _ts_decorate(decorators, target, key, desc) {
26
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
28
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
29
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
30
+ }
31
+ function _ts_metadata(k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ }
34
+ let AdminService = class AdminService {
35
+ async checkServerUpdateAndNotify() {
36
+ let lastVersion;
37
+ try {
38
+ const res = await this.http.axiosRef({
39
+ method: _applicationsconstants.HTTP_METHOD.GET,
40
+ url: _shared.APP_URL.SERVER_VERSION_MANIFEST
41
+ });
42
+ lastVersion = res.data?.tag_name || '';
43
+ } catch (e) {
44
+ this.logger.warn(`${this.checkServerUpdateAndNotify.name} - unable to check update: ${e}`);
45
+ return;
46
+ }
47
+ if (!lastVersion.startsWith('v')) {
48
+ this.logger.warn(`${this.checkServerUpdateAndNotify.name} - unable to check version: ${lastVersion}`);
49
+ return;
50
+ }
51
+ lastVersion = lastVersion.slice(1); // remove 'v' to compare with the current version
52
+ if (!(0, _checkupdate.isServerUpdateAvailable)(_appconstants.VERSION, lastVersion)) {
53
+ return;
54
+ }
55
+ // Get the last version that was notified to administrators
56
+ const notifiedVersion = await this.cache.get(this.checkServerUpdateAndNotify.name);
57
+ if (!notifiedVersion?.version) {
58
+ // The version was never stored, do it
59
+ await this.cache.set(this.checkServerUpdateAndNotify.name, {
60
+ version: _appconstants.VERSION
61
+ }, 0);
62
+ return;
63
+ }
64
+ if (notifiedVersion.version === lastVersion) {
65
+ // Notification was already sent to administrators
66
+ return;
67
+ }
68
+ const adminsToNotify = await this.adminUsersQueries.listAdminsToNotify();
69
+ if (!adminsToNotify.length) {
70
+ return;
71
+ }
72
+ const notification = {
73
+ app: _notifications.NOTIFICATION_APP.UPDATE_AVAILABLE,
74
+ event: _notifications.NOTIFICATION_APP_EVENT.UPDATE_AVAILABLE,
75
+ element: lastVersion,
76
+ externalUrl: _shared.APP_URL.RELEASES,
77
+ url: null
78
+ };
79
+ this.notificationsManager.create(adminsToNotify, notification).then(()=>this.cache.set(this.checkServerUpdateAndNotify.name, {
80
+ version: lastVersion
81
+ }, 0)).catch((e)=>this.logger.error(`${this.checkServerUpdateAndNotify.name} - ${e}`));
82
+ }
83
+ constructor(http, cache, notificationsManager, adminUsersQueries){
84
+ this.http = http;
85
+ this.cache = cache;
86
+ this.notificationsManager = notificationsManager;
87
+ this.adminUsersQueries = adminUsersQueries;
88
+ this.logger = new _common.Logger(AdminService.name);
89
+ }
90
+ };
91
+ AdminService = _ts_decorate([
92
+ (0, _common.Injectable)(),
93
+ _ts_metadata("design:type", Function),
94
+ _ts_metadata("design:paramtypes", [
95
+ typeof _axios.HttpService === "undefined" ? Object : _axios.HttpService,
96
+ typeof _cacheservice.Cache === "undefined" ? Object : _cacheservice.Cache,
97
+ typeof _notificationsmanagerservice.NotificationsManager === "undefined" ? Object : _notificationsmanagerservice.NotificationsManager,
98
+ typeof _adminusersqueriesservice.AdminUsersQueries === "undefined" ? Object : _adminusersqueriesservice.AdminUsersQueries
99
+ ])
100
+ ], AdminService);
101
+
102
+ //# sourceMappingURL=admin.service.js.map